package cn.quevo.cube.provide.define.entity;

import cn.quevo.common.entity.DoEntity;
import cn.quevo.common.enums.ResultStatusEnum;
import cn.quevo.common.exception.CheckParamsException;
import cn.quevo.common.lang.EnumUtils;
import cn.quevo.common.lang.RegularUtils;
import cn.quevo.common.lang.StringUtils;
import cn.quevo.cube.provide.define.enums.DataType;
import lombok.*;
import org.beetl.sql.core.annotatoin.Table;

/**
 * 字段类型 实体BEAN
 *
 * @author July july_sky@foxmail.com
 * @version 1.0
 * @date 2018/12/11 14:57:03
 * @Copyright 湘豫（北京）科技有限公司版权所有.All Rights Reserved.
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(name = "cube_column_type")
public class CubeColumnType extends DoEntity {

    /** 类型名称 */
    private String typeName;
    /** 字段类型CD:varchar_限制长度字符串,text_不限长度字符串,int_整数,numeric_浮点数字,date_日期,time_时间,date_time_时间戳 */
    private String columnTypeCd;
    /** 正则验证 */
    private String regular;
    /** 类型编码 */
    private String typeCode;
    /** 排序号 */
    private Long sortNum;

    /**
    * 公共参数验证
    */
    protected void validate() {
        if(StringUtils.isBlank(this.getTypeName())){
            throw new CheckParamsException(6001, "类型名称不能为空");
        }

        if(this.getSortNum() != null && StringUtils.isBlank(this.getSortNum())){
            throw new CheckParamsException(6005, "排序错误");
        }
    }

    /**
    * 新增参数验证
    */
    public void validateCreate() {
        this.validate();
        if (!EnumUtils.existsEnumIgnoreCase(this.getColumnTypeCd(), DataType.values())) {
            throw new CheckParamsException(6002,"字段类型错误");
        }
        if(StringUtils.isBlank(this.getTypeCode()) || !RegularUtils.englishAndUnderline(this.getTypeCode())){
            throw new CheckParamsException(6004, "类型编码不能为空且只能包含英文和下划线");
        }
        this.setTypeCode(this.getTypeCode().toUpperCase());
    }

    /**
    * 修改参数验证
    */
    public void validateUpdate() {
        if (StringUtils.isBlank(this.getId())) {
            throw new CheckParamsException(ResultStatusEnum.RECORD_UNSELECTED);
        }
        this.validate();
    }
}
